<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
    //函数声明、参数（形参、实参）（arguments）、返回值return
    //函数表达式、匿名函数、立即执行函数
    //回调函数、递归函数
    //函数可以作为其他函数的返回值进行返回（返回的函数要进行调用，如果不调用返回的将是一个函数声明的整个函数）
    function fn1(a,b){
        console.log('fn1函数调用');
        return a+b;
    }
    let fn2 = function(f){
        console.log('fn2函数调用');
        return f;
    }
    console.log(fn2(10));
    console.log(fn2(fn1));  //返回整个函数
    console.log('--------');
    console.log(fn2(fn1(3,2))); //想要调用函数需传参数值
    console.log(fn1(1,2));

    //作用域：作用的范围

    /*
    js的运行分两个部分：
        1.解析（编译）：语法检查、声明变量和函数
        2.执行阶段：对变量进行赋值、按照执行顺序进行执行
    
    var和let的区别：
        1.var和let声明变量：var可以先使用再声明，let不允许。var有声明提升；let声明提升后执行时会出现短暂性死区，因此会报错
        2.var在同一个作用区域内声明的变量名可以相同，而let不允许
        3.var和let都全局作用域和局部作用域（函数作用域）。
        推荐使用let（ES6），使我们的代码更严谨！！
    */
   //console.log(num1);
   console.log(num2);
   let num1;
   var num2=10;

   var num2='hello';
   console.log(num2);

   console.log('---------');

   //全局作用域:全局变量
   let a;
   let b;
   function myf(){
    //局部作用域（函数作用域）：局部变量
    let c=3;
    var d=4;
    console.log(a);
    console.log(b);
    console.log(c);
    console.log(d);
   }
   myf();
   console.log(a);
   console.log(b);
   //console.log(c);    //报错
   //console.log(d);    //报错
   
   console.log('----块作用域----');
   //在let中增加了一个块作用域{}
   for(let i=0;i<3;i++){
    console.log('i:'+i);
   }
   //console.log(i);    //报错：离开块作用域

   for(var j=0;j<3;j++){
    console.log('j:'+j);
   }
   console.log(j);

</script>
</html>